package main

import "fmt"

// 声明全局变量 方法一、方法二、方法三是可以的
var gA int = 100
var gB = 200

// 方法四声明全局变量
// := 只能用字函数体内来声明
// gc := 100
func main() {
	// 方法一：声明一个变量 默认值是0
	var a int
	fmt.Println("a = ", a)
	fmt.Printf("type of a = %T\n", a)

	// 方法二：声明一个变量，初始化一个值
	var b int = 100
	fmt.Println("b = ", b)
	fmt.Printf("type of b = %T\n", b)

	var bb string = "abcd"
	fmt.Println("bb = ", bb)
	fmt.Printf("type of bb = %T\n", bb)

	// 方法三：在初始化的时候，可以省去数据类型，通过之自动匹配当前的变量的数据类型
	var c = 100
	fmt.Println("c = ", c)
	fmt.Printf("type of c = %T\n", c)

	// 方法四：（常用的方法） 省去var关键字，直接自动匹配
	e := 100
	fmt.Println("e = ", e)
	fmt.Printf("type of e = %T\n", e)

	f := "abcd"
	fmt.Println("f = ", f)
	fmt.Printf("type of f = %T\n", f)

	g := 3.14
	fmt.Println("g = ", g)
	fmt.Printf("type of g = %T\n", g)

	// ====
	fmt.Println(gA, gB)

	// 声明多个变量
	var xx, yy int = 100, 200
	fmt.Println(xx, yy)
	var kk, ll = 100, "Aceld"
	fmt.Println(kk, ll)

	// 多行的多变量声明
	var (
		vv int  = 100
		jj bool = true
	)
	fmt.Println(vv, jj)

	// var和new
	var q int     // q = 0
	p := new(int) // 返回地址 p = 0xc00001c118
	fmt.Println("q:", q, &q)
	fmt.Println("p:", p, *p, &p)

}
